package com.shujia.scala

import java.util

import scala.collection.mutable.ListBuffer
import scala.io.Source

object Demo19List {
  def main(args: Array[String]): Unit = {

    /**
      * list: 有序不唯一查询顺序
      * set ： 无序唯一
      * map： kv结构
      * tuple： 固定长度的集合
      *
      */

    /**
      * 不可变list
      * scala中的list 提供了很多实用的方法
      */

    val list = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 1)

    println(list.head) //获取第一个元素
    println(list.tail) //获取不包含第一个元素的所有元素
    println(list.last) //获取最后一个
    println(list.take(3)) // 取topn
    println(list.takeRight(3)) //从右边取topn

    println(list(2)) //通过下标获取元素

    //和split功能相反
    println(list.mkString("|")) //通过一个分隔符将集合拼接成一个字符串
    println(list.sum) //求和
    println(list.max) //获取最大值
    println(list.min) //最小值
    println(list.sum / list.length.toDouble) //平均值

    println(list.distinct) //去重。返回一个新的集合

    println(list.reverse) //反转集合

    println(list.drop(1)) //删除一个元素，不改变原集合
    println(list)


    /**
      * 高级的方法
      *
      */

    /**
      * foreach: 循环集合中元素，一个一个传递给后面的函数
      *
      */
    var sum = 0

    list.foreach(i => {
      sum += i
    })

    println(sum)

    /**
      * map ： 循环集合中的元素一个一个传递给后面的函数，最后将函数的返回值构建成一个新的集合返回
      *
      */

    val list2: List[Int] = list.map((i: Int) => i + 2)
    println(list2)

    //改变集合中所有元素的类型
    val strs: List[String] = list.map((i: Int) => i.toString + "a")
    println(strs)

    /**
      * sort
      *
      * sortBy: 通过一个字段进行排序, 默认是升序
      *
      */

    val sortList: List[Int] = list.sortBy((i: Int) => i)
    println(sortList)

    /**
      * 读取学生数据，按照年龄排序
      *
      */

    //读取二年间得到一个集合
    val students: List[String] = Source.fromFile("data/students.txt").getLines().toList

    //按年龄排序
    val studentSort: List[String] = students.sortBy((stu: String) => -stu.split(",")(2).toInt)
    studentSort.foreach(println)

    /**
      *
      * sortWith: 指定一个排序规则
      */
    val sortList2: List[Int] = list.sortWith((i: Int, j: Int) => i > j)

    println(sortList2)


    println("=" * 100)


    val words = new util.ArrayList[String]()
    val lines = List("java,spark", "java,hadoop", "java,scala,hive", "bhase,hadoop,scala")

    for (line <- lines) {
      val split: Array[String] = line.split(",")

      for (word <- split) {
        words.add(word)
      }
    }

    println(words)

    println("=" * 100)

    /**
      *
      * flatMap: 将集合中的元素一个一个传递给后面的函数，传入一行返回多行
      * flatMap 分两步
      * 1、先进行异常map
      * 2、将函数返回的数组拆分出来构建成一个新的集合
      *
      *
      */

    val words2: List[String] = lines.flatMap((line: String) => line.split(","))
    println(words2)


    println("=" * 100)

    /**
      * 可变list
      *
      */

    val listBuffer = new ListBuffer[String]()

    //增加元素
    listBuffer += "java"

    //增加多个元素
    listBuffer ++= List("scala", "hadoop", "java")

    println(listBuffer)

    //删除一个元素
    listBuffer -= "java"

    //删除多个元素
    listBuffer --= List("hadoop", "scala")

    println(listBuffer)

    //通过下标修改元素
    listBuffer.update(0, "hadoop")

    println(listBuffer)

    //通过下标删除元素
    listBuffer.remove(0)
    println(listBuffer)


  }

}
